//
// Created by LiuYou on 2021/10/23.
//

#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <cstring>


static int srcFd;


static void releaseResources() {
    close( srcFd );

    //<editor-fold desc="将字符串存储在常量区。初始化的内存段。">
//    const char* str = "释放文件描述符。\n.";
//    write( STDOUT_FILENO, str, strlen( str ));
//    size_t strLen = strlen( str );
//    std::cout << "strLen = " << strLen << std::endl;
    //</editor-fold>

    /*
     * 将字符串常量存储在了栈上。
     */
    const char str[] = "释放文件描述符。\n.";
//    write( STDOUT_FILENO, str, sizeof( str ));
/*
/home/liuyou/CLionProjects/LinuxEnvironmentProgramming2/cmake-build-debug/src/concurrence/parallel/signal/alarm/Alarm1-MyCat /etc/services
# Network 释放文件描述符。
. |(注意光标在这里, 即将字符串的最后的空字符也打印到标准输出设备上了。)
Process finished with exit code 0
 */

//    write( STDOUT_FILENO, str, strlen( str ));
/*
/home/liuyou/CLionProjects/LinuxEnvironmentProgramming2/cmake-build-debug/src/concurrence/parallel/signal/alarm/Alarm1-MyCat /etc/services
# Network 释放文件描述符。
.|(注意光标在这里, 即没有将字符串的最后的空字符打印到标准输出设备上。)
Process finished with exit code 0
 */

    write( STDOUT_FILENO, str, sizeof( str ) - 1 );
/*
/home/liuyou/CLionProjects/LinuxEnvironmentProgramming2/cmake-build-debug/src/concurrence/parallel/signal/alarm/Alarm1-MyCat /etc/services
# Network 释放文件描述符。
.|(不打印字符串结尾的空字符。注意: 使用 sizeof(str) - 1, 是一种好的选择, 因为如果使用 strlen();就涉及到函数调用了, 没有使用 sizeof 更快。 )
Process finished with exit code 0
 */
}


int main(int argc, char** argv) {
    srcFd = open( argv[1], O_RDONLY );
    atexit( releaseResources );
    char buffer[10]{};
    /*
     * Read NBYTES into BUF from FD.  Return the number read, -1 for errors or 0 for EOF.
     * 将 NBYTES(n个字节) 从 FD 读入 BUF。返回读取的数字，-1 表示错误或 0 表示 EOF。
     */
    ssize_t readBytes = read( srcFd, buffer, sizeof( buffer ));
    if (readBytes < 0) {
        perror( "read()" );
        exit( 1 );
    }
    /*
     * Write N bytes of BUF to FD.  Return the number written, or -1.
     * 将 N 个字节的 BUF 写入 FD。返回写入的数字，或 -1。
     */
    ssize_t writeBytes = write( STDOUT_FILENO, buffer, readBytes );
    return 0;
}
